HTTPSendRequestEx
Otázka od: Lebeda David
22. 4. 2004 13:33
Ahoj,
zkousim vytvorit jednu HTTP seanci pomoci WinInet v asynchronnim rezimu, ale
moc
se mi nedari.
Podminky:
1) Bezpodminecne pouziti WinInet
2) Moznost zobrazovat prubeh komunikace do listboxu
3) Jde o jeden pozadavek: metodou POST chci odeslat serveru pozadavek, ktery
bude
mit v tele nejaka data (cca 3000 B binarnich dat), na to precist odpoved, ktera
bude
obsahovat tez nejaky balik dat. Data jsou v TMemoryStreamu.
Mam zatim zhruba toto:
FhInet := InternetOpen(PChar('AAAA'), INTERNET_OPEN_TYPE_DIRECT, nil, nil,
INTERNET_FLAG_ASYNC);
if FhInet = nil then
raise Exception.Create('InternetOpen Failed');
InternetSetStatusCallback(FhInet, @InternetStatusCallbackFunc);
FhConnection := InternetConnect(FhInet, PChar(URL), RemotePort, '', '',
INTERNET_SERVICE_HTTP, 0, 1);
if FhConnection = nil then
raise Exception.Create('InternetConnect Failed');
FhRequest := HTTPOpenRequest(FhConnection, PChar('POST'), nil, nil,
nil, nil, INTERNET_FLAG_KEEP_CONNECTION, 1);
Buff.dwStructSize := sizeof(Buff);
Buff.Next := nil;
Buff.lpcszHeader := nil;
Buff.dwHeadersLength := 0;
Buff.dwHeadersTotal := 0;
Buff.lpvBuffer := StreamKOdeslani.Memory;
Buff.dwBufferLength := StreamKOdeslani.Size;
Buff.dwBufferTotal := StreamKOdeslani.Size;
Buff.dwOffsetLow := 0;
Buff.dwOffsetHigh := 0;
if not HTTPSendRequestEx(FhRequest, @Buff, nil, 0, lparam(Self)) then
begin
if GetLastError <> ERROR_IO_PENDING then
raise Exception.Create('HTTPSendRequestEx Failed');
end;
Tento kod by mel spustit asynchronne odeslani pozadavku. Prozatim neresim
prijem
odpovedi - ten bude v callback funkci.
InternetStatusCallbackFunc je callback funkce, ktera je prozatim prazdna.
No a ted problem. Posledni parametr ve funkcich InternetConnect a dalsich ma
byt
nejaka promenna urcujici kontext. Kdyz tam dam hodnotu nula, nevznikne nikde
zadna
chyba, ale callback funkce se nikdy nevyvola. Kdyz tam dam cokoli jineho,
program do
callback funkce vleze (predane parametry jsou ale nesmyslne, a po jejim
skonceni
vznikne access violation v kernel32.dll.
Nemate nekdo nahodou nejaky funkcni priklad na asynchronni komunikaci pres
WinInet
- nebo aspon nevite, co delam spatne?
Diky
David Lebeda